home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_06 / 2n06030a < prev    next >
Text File  |  1991-04-28  |  2KB  |  86 lines

  1. /* ----------------------------------------------------------
  2.  *  Turbo C++
  3.  *
  4.  *  Source code Copyright (c) 1991 T.W. Nelson. May be used
  5.  *  only for non-commercial purposes with appropriate
  6.  *  acknowledgement of copyright.
  7.  * ------------------------------------------------------- */
  8.  
  9. #include <stdio.h>
  10. #include <dos.h>
  11. #include "snooper.h"
  12.  
  13. static struct code_profiler    {
  14.     long    t1;             /* starting tick count */
  15.     long    t2;             /* ending tick count */
  16.     long    count;          /* execution count */
  17.     int     refcnt;         /* reference count */
  18.     } Area[MAX_AREA_MARKERS];
  19.  
  20. #define SECS_PER_TICK   0.0549  /* seconds/clock tick */
  21.  
  22. /* Point to BIOS clock tick record. This avoids messing
  23.  * with the midnight roll-over flag as done by int 1ah ...*/
  24. static unsigned long far *BiosTimeCount =
  25.              (unsigned long far *) MK_FP( 0, 0x46c);
  26.  
  27. void d_begmark(int id)
  28. {
  29.        /* Enter a marked area. Beginning time is assigned
  30.         * only the first time thru.
  31.         */
  32.  
  33.         if( id > MAX_AREA_MARKERS - 1 )  {
  34.                 __BREAK(__SCRN__, d_printf(
  35.                   "Invalid area marker id %d\n", id));
  36.                 id = 0;
  37.         }
  38.  
  39.         if( Area[id].t1 == 0L )
  40.                 Area[id].t1 = *BiosTimeCount;
  41.  
  42.         ++Area[id].count;
  43.         ++Area[id].refcnt;
  44. }
  45.  
  46. void d_endmark( int id )
  47. {
  48.        /* Exit a marked area. Ending time is updated each
  49.         * time thru. Counts are taken only on entry.
  50.         */
  51.  
  52.         if( id > MAX_AREA_MARKERS - 1 )  {
  53.                 __BREAK(__SCRN__, d_printf(
  54.                   "Invalid area marker id %d\n", id));
  55.                 id = 0;
  56.         }
  57.  
  58.         Area[id].t2 = *BiosTimeCount;
  59.         --Area[id].refcnt;
  60. }
  61.  
  62. void d_profile(void)
  63. {
  64.    /* Dump all execution statistics to a debugger device
  65.     * specified as part of a __BREAK statement.
  66.     */
  67.  
  68.     int i;
  69.     d_printf("\n" );
  70.     d_printf("Profiling statistics:\n\n" );
  71.     d_printf("Area  Count       RefCnt Time (secs)\n" );
  72.     d_printf("------------------------------------\n" );
  73.  
  74.     for( i = 0; i < MAX_AREA_MARKERS; i++ )  {
  75.         d_printf("%-6d%-12ld%-7d%f\n", i,
  76.             Area[i].count, Area[i].refcnt,
  77.             (Area[i].t2 - Area[i].t1) * SECS_PER_TICK );
  78.  
  79.         Area[i].t1 = 0L;
  80.         Area[i].count = 0L;
  81.         Area[i].refcnt = 0;
  82.     }
  83. }
  84.  
  85. /* ------------------------------------------------------- */
  86.